<?php

/*
 * 工厂模式(静态工厂模式,多态工厂模式,工具箱模式)
 * 当某个类的对象需要在很多页面中使用的时候,如果每个页面都去实例化,那么页面中将有很多类似于$obj = new Object()这样的代码;当类被删除或者改名时,需要对每个页面的代码进行更改,工作量大且繁琐
 * 使用工厂模式则可以解决这种问题,
 * 想要取得该类的对象,则在外部进行静态方法的访问即可获得该类的实例化对象
 * 
 */

namespace IMooc;

class Factory {

    static $proxy = null;

    static function createPaginator()
    {
        return new Paginator(); //实例化该类的对象时,注意命名空间
    }

    //在工厂模式中,使用注册器去将用工厂模式生产出的一个对象注册到全局树上,再在用的时候从全局树上直接取,否则,当我们需要对同一个对象进行多次操作时,使用一次工厂模式,就会生产出一个对象,造成资源浪费
    static function getUser($id)
    {
        $key = 'user_' . $id;
        $user = Register::get($key);
        if (!$user)
        {
            $user = new User($id);
            Register::set($key, $user);
        }
        return $user;
    }

    static function getModel($name)
    {
        $key = 'app_model_' . $name;
        $model = Register::get($key);
        if (!$model)
        {
            $class = '\\App\\Model\\' . ucwords($name);
            $model = new $class;
            Register::set($key, $model);
        }
        return $model;
    }

    static function getDatabase($id = 'proxy')
    {
        if ($id == 'proxy')
        {
            if (!self::$proxy)
            {
                self::$proxy = new \IMooc\Database\Proxy;
            }
            return self::$proxy;
        }
        $key = 'database_' . $id;
        if ($id == 'slave')
        {
            $slaves = Application::getInstance()->config['database']['slave'];
            $db_conf = $slaves[array_rand($slaves)];
        }
        else
        {
            $db_conf = Application::getInstance()->config['database'][$id];
        }
        $db = Register::get($key);
        if (!$db)
        {
            $db = new Database\MySQLi();
            $db->connect($db_conf['host'], $db_conf['user'], $db_conf['password'], $db_conf['dbname']);
            Register::set($key, $db);
        }
        return $db;
    }

}
